package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.entity.BaseAttrValue;
import com.atguigu.gmall.product.service.BaseAttrValueService;
import com.atguigu.gmall.product.vo.SaveAttrInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.entity.BaseAttrInfo;
import com.atguigu.gmall.product.service.BaseAttrInfoService;
import com.atguigu.gmall.product.mapper.BaseAttrInfoMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author lfy
* @description 针对表【base_attr_info(属性表)】的数据库操作Service实现
* @createDate 2023-08-14 16:26:08
*/
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo>
    implements BaseAttrInfoService{

    @Autowired
    BaseAttrValueService baseAttrValueService;

    @Override
    public List<BaseAttrInfo> attrInfoList(Long c1id, Long c2id, Long c3id) {



        return baseMapper.getAttrInfoList(c1id,c2id,c3id);
    }


    @Transactional
    @Override
    public void saveAttrInfo(SaveAttrInfoVo vo) {
        //1、保存 base_attr_info
        BaseAttrInfo attrInfo = new BaseAttrInfo();
        //属性对拷; 前提，entity和vo的属性名一模一样
//        attrInfo.setAttrName(vo.getAttrName());
//        attrInfo.setCategoryId(vo.getCategoryId());
//        attrInfo.setCategoryLevel(vo.getCategoryLevel());
        BeanUtils.copyProperties(vo,attrInfo);

        save(attrInfo);

        // mybatis-plus会自动把上次保存的自增id，封装到entity的id属性
        Long attrId = attrInfo.getId();


        //stream api
        //2、保存 base_attr_value
//        List<BaseAttrValue> values = new ArrayList<>();
//
//        //vo获取提交的属性值
//        for (SaveAttrInfoVo.AttrValueListDTO dto : vo.getAttrValueList()) {
//            //准备对象
//            BaseAttrValue attrValue = new BaseAttrValue();
//            String valueName = dto.getValueName();
//            //属性值
//            attrValue.setValueName(valueName);
//            //回填属性的自增id
//            attrValue.setAttrId(attrId);
//            values.add(attrValue);
//        }


        //声明式编程
        List<BaseAttrValue> attrValues = vo.getAttrValueList()
                .stream()
                .map(item -> { //item 流中的每一个元素
                    BaseAttrValue value = new BaseAttrValue();
                    value.setAttrId(attrId);
                    value.setValueName(item.getValueName());
                    return value;
                }).collect(Collectors.toList()); //收集流的所有数据
        //批量保存
        baseAttrValueService.saveBatch(attrValues);
    }

    @Override
    public void updateAttrInfo(SaveAttrInfoVo vo) {
        //1、修改属性
        boolean update = lambdaUpdate()
                .set(BaseAttrInfo::getAttrName, vo.getAttrName())
                .set(BaseAttrInfo::getCategoryId, vo.getCategoryId())
                .set(BaseAttrInfo::getCategoryLevel, vo.getCategoryLevel())
                .eq(BaseAttrInfo::getId, vo.getId())
                .update();

        //2、修改属性值（新增值、修改值、删除值、啥也没动）
        //2.0)、以前数据库有 59、60、61、62， 现在前端带来了 60,61，说明59要删除
        // notin 计算差集： delete from base_attr_value where id not in(60,61) and attr_id=13
        // 先做删除；
        // 不先做删除； 会导致把新值的也删除了。

        //2.0.1、收集前端带来的值id；
        List<Long> valueIds = vo.getAttrValueList().stream()
                .filter(item -> item.getId() != null)
                .map(item -> item.getId())
                .collect(Collectors.toList());

        //删除前端没带的
        if(valueIds!=null && valueIds.size()>0){
            //有提交有效的属性id，就进行notin差集删除
            baseAttrValueService.lambdaUpdate()
                    .notIn(BaseAttrValue::getId, valueIds)
                    .eq(BaseAttrValue::getAttrId, vo.getId())
                    .remove();
        }else {
            //前端没有提交任何属性值id，说明这些属性全删
            baseAttrValueService.lambdaUpdate()
                    .eq(BaseAttrValue::getAttrId, vo.getId())
                    .remove();
        }


        //2.1)、带了值id的，说明以前有，这次可能修改。 操作： 直接去数据库按照 id更新
        vo.getAttrValueList()
                .stream()
                .forEach(item->{
                    if (item.getId()==null) {
                        //2.2)、没带值id的，说明以前没有，这次是信息。 操作： 直接去数据库保存一条value记录
                        BaseAttrValue attrValue = new BaseAttrValue();
                        attrValue.setValueName(item.getValueName());
                        attrValue.setAttrId(vo.getId());
                        baseAttrValueService.save(attrValue);
                    }else {
                        baseAttrValueService.lambdaUpdate()
                                .set(BaseAttrValue::getValueName,item.getValueName())
                                .eq(BaseAttrValue::getId,item.getId())
                                .update();
                    }
                });
    }
}




